import axios from 'axios';
import { showLoading, hideLoading } from '@/components/Loading'; // 自定义加载动画组件
import { message } from 'antd';


// 根据环境变量获取基础URL
const BASE_URL = process.env.VUE_APP_API_BASE_URL; // Vue环境变量
// const BASE_URL = process.env.REACT_APP_API_BASE_URL; // React环境变量

// 创建实例
const service = axios.create({
    baseURL: BASE_URL,
    timeout: 8000,
});

// 请求计数器（避免多个请求重复触发loading）
let requestCount = 0;
const showGlobalLoading = () => {
    if (requestCount === 0) showLoading();
    requestCount++;
};
const hideGlobalLoading = () => {
    requestCount--;
    if (requestCount === 0) hideLoading();
};

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 全局loading控制
        if (!config.headers?.noLoading) {
            showGlobalLoading();
        }

        // 自动携带token
        const token = localStorage.getItem('token');
        if (token) {
            config.headers.Authorization = `Bearer ${token}`;
        }

        return config;
    },
    error => {
        hideGlobalLoading();
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    response => {
        hideGlobalLoading();
        const { data, status } = response;

        // 自定义业务状态码处理（假设200为成功）
        if (status === 200 && data.code === 200) {
            return data;
        } else {
            return handleError(response);
        }
    },
    error => {
        hideGlobalLoading();
        return handleError(error.response || error);
    }
);

// 统一错误处理
function handleError(error) {
    const status = error?.status || error?.code;
    const errorMessage = error?.data?.message || '请求异常，请稍后重试';

    // 根据状态码提示
    switch (status) {
        case 401:
            message.error('登录过期，请重新登录');
            router.push('/login');
            break;
        case 403:
            message.error('无权访问');
            break;
        case 404:
            message.error('资源未找到');
            break;
        case 500:
            message.error('服务器错误');
            break;
        default:
            message.error(errorMessage);
    }

    return Promise.reject(error);
}

export default service;